/* --------------------------- usage: Function.prototype.call(thisArg[,arg[,arg2 ... ]]) --------------------------- */
var x = 10;
var o = {
	x : 15
};
function f(msg, msg2) {
	alert(msg);
	alert(msg2);
	alert(this.x);
}

f('invoking f');
f.call(o, 'invoking f via call', 'ahah');// 当前指针指向o

/* --------------------------- usage: Function.prototype.apply(thisArg,argArray) --------------------------- */
var x = 10;
var o = {
	x : 15
};
function f(msg, msg2) {
	alert(msg);
	alert(msg2);
	alert(this.x);
}

f('invoking f');
f.apply(o, ['invoking f through apply', 'haha']);// 这时f()中的this.x的this指向o

// 运用这两个方法可以创建Function的代理
var y = 20;

var o = {
	x : 15
};

function f1(msg) {
	// alert(msg + this.y);
	alert(msg + this.x);
}

function f2(msg, msg2) {
	alert(msg + (this.x * this.x) + msg2);
}

function g(o, func, args) {
	func.apply(o, args);
}

g(o, f1, ["the value of x = "]);// 在函数f1中使用对象o的作用域
g(o, f2, ["the value of x squared = ", ". Wow!"]);

/* --------------------------- arguments --------------------------- */
function f(msg) {
	for (var i = 1; i < arguments.length; i++) {
		msg += arguments[i];
	}
	alert(msg);
}

f("H", "e", "l", "l", "o");